package com.lekang.le.service.impl;

import java.util.Date;
import java.util.List;
import com.lekang.common.core.domain.entity.SysUser;
import com.lekang.common.utils.DateUtils;
import com.lekang.common.utils.StringUtils;
import com.lekang.le.domain.ElderlySzh;
import com.lekang.le.domain.FamilyMember;
import com.lekang.le.domain.WxUserBinding;
import com.lekang.le.mapper.WxUserBindingMapper;
import com.lekang.le.service.IWxUserBindingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 微信用户绑定老人Service业务层处理
 * 
 * @author lekang
 * @date 2025-01-27
 */
@Service
public class WxUserBindingServiceImpl implements IWxUserBindingService 
{
    @Autowired
    private WxUserBindingMapper wxUserBindingMapper;

    /**
     * 查询微信用户绑定老人
     * 
     * @param id 微信用户绑定老人主键
     * @return 微信用户绑定老人
     */
    @Override
    public WxUserBinding selectWxUserBindingById(Long id)
    {
        return wxUserBindingMapper.selectWxUserBindingById(id);
    }

    /**
     * 查询微信用户绑定老人列表
     * 
     * @param wxUserBinding 微信用户绑定老人
     * @return 微信用户绑定老人
     */
    @Override
    public List<WxUserBinding> selectWxUserBindingList(WxUserBinding wxUserBinding)
    {
        return wxUserBindingMapper.selectWxUserBindingList(wxUserBinding);
    }

    /**
     * 新增微信用户绑定老人
     * 
     * @param wxUserBinding 微信用户绑定老人
     * @return 结果
     */
    @Override
    public int insertWxUserBinding(WxUserBinding wxUserBinding)
    {
        wxUserBinding.setCreateTime(DateUtils.getNowDate());
        return wxUserBindingMapper.insertWxUserBinding(wxUserBinding);
    }

    /**
     * 修改微信用户绑定老人
     * 
     * @param wxUserBinding 微信用户绑定老人
     * @return 结果
     */
    @Override
    public int updateWxUserBinding(WxUserBinding wxUserBinding)
    {
        wxUserBinding.setUpdateTime(DateUtils.getNowDate());
        return wxUserBindingMapper.updateWxUserBinding(wxUserBinding);
    }

    /**
     * 批量删除微信用户绑定老人
     * 
     * @param ids 需要删除的微信用户绑定老人主键
     * @return 结果
     */
    @Override
    public int deleteWxUserBindingByIds(Long[] ids)
    {
        return wxUserBindingMapper.deleteWxUserBindingByIds(ids);
    }

    /**
     * 删除微信用户绑定老人信息
     * 
     * @param id 微信用户绑定老人主键
     * @return 结果
     */
    @Override
    public int deleteWxUserBindingById(Long id)
    {
        return wxUserBindingMapper.deleteWxUserBindingById(id);
    }

    /**
     * 绑定家人（老人）
     * 
     * @param wxUserId 微信用户ID
     * @param familyName 家人姓名（老人姓名）
     * @param idCard 身份证号（老人身份证号）
     * @param relationship 称呼关系
     * @return 绑定结果
     */
    @Override
    public String bindFamily(Long wxUserId, String familyName, String idCard, String relationship)
    {
        // 1. 参数验证
        if (wxUserId == null) {
            return "微信用户ID不能为空";
        }
        if (StringUtils.isEmpty(familyName)) {
            return "家人姓名不能为空";
        }
        if (StringUtils.isEmpty(idCard)) {
            return "身份证号不能为空";
        }
        if (StringUtils.isEmpty(relationship)) {
            return "称呼关系不能为空";
        }

        // 2. 身份证号格式验证
        if (!isValidIdCard(idCard)) {
            return "身份证号格式不正确";
        }

        // 3. 查询微信用户信息（获取昵称和电话）
        SysUser wxUser = wxUserBindingMapper.selectUserById(wxUserId);
        if (wxUser == null) {
            return "微信用户信息不存在";
        }
        
        // 验证必需字段
        String userName = wxUser.getNickName();
        String userPhone = wxUser.getPhonenumber();
        
        if (StringUtils.isEmpty(userName)) {
            userName = "微信用户"; // 默认值
        }
        if (StringUtils.isEmpty(userPhone)) {
            userPhone = ""; // 默认值
        }

        // 4. 检查该身份证号是否已存在
        ElderlySzh existingElderly = wxUserBindingMapper.selectElderlyByIdCard(idCard);
        Long elderlyId;
        
        if (existingElderly != null) {
            // 老人已存在，直接使用该老人ID
            elderlyId = existingElderly.getId();
            
            // 检查是否已绑定该老人
            if (isAlreadyBound(wxUserId, elderlyId)) {
                return "您已绑定该老人，无需重复绑定";
            }
        } else {
            // 老人不存在，新增老人记录
            ElderlySzh newElderly = new ElderlySzh();
            newElderly.setName(familyName);
            newElderly.setIdCard(idCard);
            
            // 随机生成床位ID（1-12之间）
            Long randomBedId = (long) (Math.random() * 12 + 1);
            newElderly.setBedId(randomBedId);
            
            // 插入老人记录
            int elderlyResult = wxUserBindingMapper.insertElderly(newElderly);
            if (elderlyResult <= 0) {
                return "新增老人信息失败";
            }
            
            elderlyId = newElderly.getId();
        }

        // 5. 在 wx_user_binding 表中创建绑定记录
        WxUserBinding binding = new WxUserBinding();
        binding.setWxUserId(wxUserId);
        binding.setElderlyId(elderlyId);

        int bindingResult = insertWxUserBinding(binding);
        if (bindingResult <= 0) {
            return "创建绑定关系失败";
        }

        // 6. 在 family_member 表中添加家属信息
        FamilyMember familyMember = new FamilyMember();
        familyMember.setElderlyId(elderlyId);
        familyMember.setName(userName);
        familyMember.setContact(userPhone);
        familyMember.setRelationship(relationship);

        int familyResult = wxUserBindingMapper.insertFamilyMember(familyMember);
        if (familyResult <= 0) {
            return "添加家属信息失败";
        }

        return "绑定成功";
    }

    /**
     * 根据微信用户ID查询绑定的老人列表
     * 
     * @param wxUserId 微信用户ID
     * @return 绑定关系列表
     */
    @Override
    public List<WxUserBinding> selectByWxUserId(Long wxUserId)
    {
        return wxUserBindingMapper.selectByWxUserId(wxUserId);
    }

    /**
     * 检查是否已绑定该老人
     * 
     * @param wxUserId 微信用户ID
     * @param elderlyId 老人ID
     * @return 是否已绑定
     */
    @Override
    public boolean isAlreadyBound(Long wxUserId, Long elderlyId)
    {
        WxUserBinding binding = wxUserBindingMapper.selectByWxUserIdAndElderlyId(wxUserId, elderlyId);
        return binding != null;
    }

    /**
     * 身份证号格式验证
     * 
     * @param idCard 身份证号
     * @return 是否有效
     */
    private boolean isValidIdCard(String idCard) {
        if (StringUtils.isEmpty(idCard)) {
            return false;
        }
        // 简单的身份证号格式验证：18位数字，最后一位可能是X
        String regex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
        return idCard.matches(regex);
    }

    /**
     * 解绑家人（小程序端使用）
     * 只删除wx_user_binding表的记录，不删除family_member表
     * 
     * @param bindingId 绑定关系ID（wx_user_binding表的主键）
     * @param wxUserId 微信用户ID（用于安全验证）
     * @return 结果
     */
    @Override
    public int unbindFamily(Long bindingId, Long wxUserId)
    {
        // 1. 验证参数
        if (bindingId == null || wxUserId == null) {
            return 0;
        }

        // 2. 查询绑定关系，验证是否属于当前用户
        WxUserBinding binding = wxUserBindingMapper.selectWxUserBindingById(bindingId);
        if (binding == null) {
            return 0;
        }

        // 3. 安全验证：确保只能解绑自己的绑定关系
        if (!binding.getWxUserId().equals(wxUserId)) {
            return 0;
        }

        // 4. 删除wx_user_binding表的记录
        return wxUserBindingMapper.deleteWxUserBindingById(bindingId);
    }
}
